/************************************
 文件明 ：  bsp_int.h
 作者   ：  胡秋峰
 描述   ：  中断驱动文件
 ************************************/
#include "bsp_int.h"

/* 中断嵌套计数器 */
static uint32_t irq_nexting;

/* 中断服务函数表 */
static sys_irq_handler_t irq_table[NUMBER_OF_INT_VECTORS];

/**
 * @描述    ： 中断初始化函数
 * @参数    ： 无
 * @返回值  ： 无 
 */
void int_init(void)
{
    GIC_Init();                         /* 初始化GIC */
    system_irq_table_init();            /* 初始化中断向量表 */
    __set_VBAR((uint32_t)0X87800000);   /* 中断向量表偏移 */
}

/**
 * @描述    ： 初始化中断向量表
 * @参数    ： 无
 * @返回值  ： 无 
 */
void system_irq_table_init(void)
{
    uint32_t i = 0;
    irq_nexting = 0;

    /* 所有中断服务函数设置为默认 */
    for (i = 0; i < NUMBER_OF_INT_VECTORS; i++)
    {
        system_register_irq_handler(i, default_irq_handler, NULL);
    }
}

/**
 * @描述            ： 给指定的中断号注册中断服务函数
 * @参数-irq        ： 中断号
 * @参数-handler    ： 中断服务函数
 * @参数-userParam  ： 参数
 * @返回值          ： 无 
 */
void system_register_irq_handler(IRQn_Type irq, 
                                 system_irq_handler_t handler,
                                 void *userParam)
{
    irq_table[irq].irqHandler = handler;
    irq_table[irq].userParam = userParam;
}

/**
 * @描述            ： C语言中断服务函数，irq汇编会调用此函数
 * @参数-giccIar    ： 中断号
 * @返回值          ： 无 
 */
void system_irq_handler(uint32_t giccIar)
{
    uint32_t intNum = giccIar & 0X3FFUL;

    /* 检查中断号是否正确 */
    if ((intNum == 1020) || (intNum >= NUMBER_OF_INT_VECTORS) )
    {
        return;
    }

    irq_nexting++; /* 中断嵌套计数器加1 */
    irq_table[intNum].irqHandler(intNum, irq_table[intNum].userParam);
    irq_nexting--; /* 中断嵌套计数器减1 */
}

/**
 * @描述            ： 默认中断服务函数
 * @参数-giccIar    ： 中断号
 * @返回值          ： 无 
 */
void default_irq_handler(uint32_t giccIar, void *userParam)
{
    //TODO
}